package main

import "fmt"

/*
   go语言中接口和实现类的关系是 非侵入式（不需要显示的声明）

	接口用法：
	一个函数如果接受接口类型作为参数，那么实际上可以传入该接口的任意实现类型对象作为参数
	定义一个类型为接口类型，实际上可以赋值为任意实现类的对象

	鸭子类型（某个东西会游泳也会像鸭子一样嘎嘎叫，就可以把它看做是一只可爱的小黄鸭 🦆）

*/

func main() {
	m1 := Mouse{"双飞燕"}
	fmt.Println(m1)
	usbinterface(m1)
}

//定义接口
type USB interface {
	star()
	end()
}

//实现类
type Mouse struct {
	name string
}

type FlashDisk struct {
	name string
}

func (m Mouse) star() {
	fmt.Println(m.name + "鼠标插进去了")
}

func (m Mouse) end() {
	fmt.Println(m.name + "鼠标插了一下又拔出来了")
}

func (f FlashDisk) star() {
	fmt.Println(f.name + "U盘插进去了")
}

func (f FlashDisk) end() {
	fmt.Println(f.name + "U盘插了一下又拔出来了")
}

func usbinterface(usb USB) {
	usb.star()
	usb.end()
}
